<template>
  <view class="container">
    <view class="title">扫码示例</view>
    <!-- 扫码按钮 -->
    <button class="scan-btn" type="primary" @click="openScanCode">点击扫码</button>
    <!-- 扫码结果展示 -->
    <view class="result" v-if="scanResult">
      <view class="result-title">扫码结果：</view>
      <view class="result-item">内容：{{ scanResult.result }}</view>
      <view class="result-item">类型：{{ scanResult.scanType }}</view>
      <view class="result-item">字符集：{{ scanResult.charSet }}</view>
      <view class="result-item" v-if="scanResult.path">路径：{{ scanResult.path }}</view>
    </view>
  </view>
</template>

<script setup>
import { ref } from 'vue';

// 存储扫码结果
const scanResult = ref(null);

// 打开扫码功能
const openScanCode = () => {
  // 调用Uniapp的扫码API
  uni.scanCode({
    // 扫码类型
    scanType: ['barCode', 'qrCode'],
    // 是否显示相册
    showAlbum: false,

    success: (res) => {
      console.log('扫码成功', res);
      scanResult.value = res;
      // 处理扫码得到的参数
      if (res.result) {
        parseParams(res.result);
      }
    },
    fail: (err) => {
      console.error('扫码失败', err);
      uni.showToast({
        title: '扫码失败，请重试',
        icon: 'none'
      });
    },
    // 无论成功失败都会执行的回调
    complete: () => {
      console.log('扫码完成');
    }
  });
};

// 解析扫码结果中的参数
const parseParams = (result) => {
  // 示例：如果扫码结果是一个URL，可以解析其中的参数
  try {
    // 检查是否是URL
    if (result.startsWith('http')) {
      const url = new URL(result);
      const params = new URLSearchParams(url.search);
      
      // 例如获取code参数
      const code = params.get('code');
      if (code) {
        console.log('解析到code参数：', code);
        // 可以在这里进行后续操作，如跳转页面、请求接口等
      }
    } 
	else {
      // 处理非URL类型的扫码结果
      console.log('扫码内容：', result);
    }
  } catch (e) {
    console.error('解析参数失败', e);
  }
};
</script>

<style scoped>
.container {
  padding: 20rpx;
  display: flex;
  flex-direction: column;
  align-items: center;
}

.title {
  font-size: 36rpx;
  margin: 40rpx 0;
  font-weight: bold;
}

.scan-btn {
  width: 600rpx;
  height: 80rpx;
  line-height: 80rpx;
  font-size: 32rpx;
}

.result {
  margin-top: 60rpx;
  width: 600rpx;
  padding: 30rpx;
  border: 1px solid #eee;
  border-radius: 10rpx;
}

.result-title {
  font-size: 30rpx;
  margin-bottom: 20rpx;
  color: #333;
  font-weight: bold;
}

.result-item {
  font-size: 28rpx;
  margin: 10rpx 0;
  color: #666;
}
</style>
